#include "eventrecord_table.h"
#include "ui_eventrecord_table.h"
#include <QDateTime>
#include <QMessageBox>

eventrecord_table::eventrecord_table(QWidget *parent)
    : QWidget(parent), ui(new Ui::eventrecord_table)
{
    ui->setupUi(this);
    setAttribute(Qt::WA_StyledBackground); // 使样式表生效

    // 设置默认时间范围为当天
    QDateTime currentDateTime = QDateTime::currentDateTime();
    QDateTime startOfDay = currentDateTime.date().startOfDay();
    QDateTime endOfDay = currentDateTime.date().endOfDay();

    ui->startTimeEdit->setDateTime(startOfDay);
    ui->endTimeEdit->setDateTime(endOfDay);

    // 设置日期时间格式
    ui->startTimeEdit->setDisplayFormat("yyyy-MM-dd HH:mm:ss");
    ui->endTimeEdit->setDisplayFormat("yyyy-MM-dd HH:mm:ss");

    // 设置日期时间范围限制
    ui->startTimeEdit->setMinimumDateTime(QDateTime(QDate(2000, 1, 1), QTime(0, 0, 0)));
    ui->endTimeEdit->setMinimumDateTime(QDateTime(QDate(2000, 1, 1), QTime(0, 0, 0)));
    ui->startTimeEdit->setMaximumDateTime(QDateTime(QDate(2100, 12, 31), QTime(23, 59, 59)));
    ui->endTimeEdit->setMaximumDateTime(QDateTime(QDate(2100, 12, 31), QTime(23, 59, 59)));
}

eventrecord_table::~eventrecord_table()
{
    delete ui;
}

bool eventrecord_table::processJsonCommand(const QString &jsonStr, QString *err)
{
    // 解析传入的JSON字符串
    QJsonDocument doc = QJsonDocument::fromJson(jsonStr.toUtf8());

    if (doc.isNull() || !doc.isObject())
    {
        if (err)
            *err = "Invalid JSON format";
        return false;
    }

    QJsonObject rootObject = doc.object();

    // 检查是否存在plugin_config对象
    if (!rootObject.contains("plugin_config") || !rootObject["plugin_config"].isObject())
    {
        if (err)
            *err = "plugin_config object not found";
        return false;
    }

    QJsonObject pluginConfig = rootObject["plugin_config"].toObject();

    // 提取权限信息
    if (pluginConfig.contains("permission"))
    {
        QString permission = pluginConfig["permission"].toString();

        // 根据权限控制UI元素的可见性和可用性
        bool hasPermission = (permission == "1"); // 权限为"1"表示已登录，启用功能

        // 控制一键清空按钮的启用状态
        ui->pb_clear->setEnabled(hasPermission);

        // 控制表格中所有删除按钮的启用状态
        for (int row = 0; row < ui->tableWidget->rowCount(); ++row)
        {
            QWidget *cellWidget = ui->tableWidget->cellWidget(row, 6); // 第7列(索引6)是操作列
            if (cellWidget)
            {
                QPushButton *deleteButton = qobject_cast<QPushButton *>(cellWidget);
                if (deleteButton)
                {
                    deleteButton->setEnabled(hasPermission);
                }
            }
        }

        qDebug() << "权限设置已更新为:" << permission;
        return true;
    }
    else
    {
        if (err)
            *err = "permission field not found in plugin_config";
        return false;
    }
}

void eventrecord_table::queryAndDisplayEvents(const QString &startTime, const QString &endTime)
{
    // 动态获取数据库连接
    QSqlDatabase db;

    // 首先尝试获取已存在的命名连接
    if (QSqlDatabase::contains("warning_db"))
    {
        db = QSqlDatabase::database("warning_db");
    }
    else
    {
        // 如果不存在命名连接，则尝试获取默认连接
        db = QSqlDatabase::database();
    }

    // 检查数据库连接是否有效
    if (!db.isValid())
    {
        emit signalToForward("数据库连接无效");
        return;
    }

    // 检查数据库是否打开
    if (!db.isOpen())
    {
        // 尝试打开数据库
        if (!db.open())
        {
            emit signalToForward("数据库打开失败: " + db.lastError().text());
            return;
        }
    }

    // 查询报警记录（从warnings表中），增加id字段
    QSqlQuery query(db);
    query.prepare("SELECT id, block_name, position, value, start_time, end_time, status "
                  "FROM warnings "
                  "WHERE start_time BETWEEN ? AND ? "
                  "ORDER BY start_time DESC");
    query.addBindValue(startTime);
    query.addBindValue(endTime);

    if (!query.exec())
    {
        emit signalToForward("查询报警记录失败: " + query.lastError().text());
        qDebug() << "查询失败:" << query.lastError().text();
        return;
    }

    QList<EventRecordInfo> events;
    int recordCount = 0;
    while (query.next())
    {
        EventRecordInfo eventInfo;
        // 按照SELECT语句中的顺序赋值，第一个是id
        eventInfo.id = query.value(0).toInt();            // 记录ID
        eventInfo.blockName = query.value(1).toString();  // 柜名
        eventInfo.position = query.value(2).toString();   // 安装位置
        eventInfo.alarmValue = query.value(3).toString(); // 报警值
        eventInfo.startTime = query.value(4).toString();  // 发生时间
        eventInfo.endTime = query.value(5).toString();    // 消除时间
        eventInfo.status = query.value(6).toString();     // 报警状态

        events.append(eventInfo);
        recordCount++;
    }

    qDebug() << "总共找到记录数:" << recordCount;
    qDebug() << "查询时间范围: 从" << startTime << "到" << endTime;

    updateEventTable(events);
}

void eventrecord_table::updateEventTable(const QList<EventRecordInfo> &events)
{
    qDebug() << "开始更新事件表格，事件数量:" << events.size();

    // 清空并设置表格
    ui->tableWidget->clearContents();
    ui->tableWidget->setRowCount(events.size());
    ui->tableWidget->setColumnCount(7); // 增加到7列

    // 设置表头
    QStringList headers;
    headers << "柜名" << "安装位置" << "报警值" << "发生时间" << "恢复时间" << "报警状态" << "操作";
    ui->tableWidget->setHorizontalHeaderLabels(headers);
    ui->tableWidget->verticalHeader()->setVisible(false);

    // 填充表格数据
    for (int i = 0; i < events.size(); ++i)
    {
        const EventRecordInfo &info = events.at(i);

        // 使用实际的数据创建表格项
        QTableWidgetItem *blockItem = new QTableWidgetItem(info.blockName);
        QTableWidgetItem *positionItem = new QTableWidgetItem(info.position);
        QTableWidgetItem *valueItem = new QTableWidgetItem(info.alarmValue);
        QTableWidgetItem *startItem = new QTableWidgetItem(info.startTime);

        // 处理消除时间显示
        QString displayEndTime = info.endTime;
        if (displayEndTime.isEmpty())
        {
            displayEndTime = "未消除";
        }
        QTableWidgetItem *endItem = new QTableWidgetItem(displayEndTime);

        // 处理状态显示，统一显示为"报警"或"恢复"
        QString displayStatus;
        if (info.endTime.isEmpty())
        {
            displayStatus = "报警";
        }
        else
        {
            displayStatus = "恢复";
        }
        QTableWidgetItem *statusItem = new QTableWidgetItem(displayStatus);

        // 设置表格项不可编辑
        blockItem->setFlags(blockItem->flags() & ~Qt::ItemIsEditable);
        positionItem->setFlags(positionItem->flags() & ~Qt::ItemIsEditable);
        valueItem->setFlags(valueItem->flags() & ~Qt::ItemIsEditable);
        startItem->setFlags(startItem->flags() & ~Qt::ItemIsEditable);
        endItem->setFlags(endItem->flags() & ~Qt::ItemIsEditable);
        statusItem->setFlags(statusItem->flags() & ~Qt::ItemIsEditable);

        // 设置所有项内容居中对齐
        blockItem->setTextAlignment(Qt::AlignCenter);
        positionItem->setTextAlignment(Qt::AlignCenter);
        valueItem->setTextAlignment(Qt::AlignCenter);
        startItem->setTextAlignment(Qt::AlignCenter);
        endItem->setTextAlignment(Qt::AlignCenter);
        statusItem->setTextAlignment(Qt::AlignCenter);

        // 为状态列设置背景颜色（使用样式表方式）
        if (displayStatus == "报警")
        {
            statusItem->setData(Qt::BackgroundRole, QColor(255, 0, 0)); // 红色
        }
        else if (displayStatus == "恢复")
        {
            statusItem->setData(Qt::BackgroundRole, QColor(0, 255, 0)); // 绿色
        }

        // 将项添加到表格中
        ui->tableWidget->setItem(i, 0, blockItem);
        ui->tableWidget->setItem(i, 1, positionItem);
        ui->tableWidget->setItem(i, 2, valueItem);
        ui->tableWidget->setItem(i, 3, startItem);
        ui->tableWidget->setItem(i, 4, endItem);
        ui->tableWidget->setItem(i, 5, statusItem);

        // 为每一行添加删除按钮
        QPushButton *deleteButton = new QPushButton("删除");
        deleteButton->setProperty("row", i);
        deleteButton->setProperty("recordId", info.id); // 使用记录ID而不是startTime

        // 根据一键清空按钮的状态设置删除按钮的初始使能状态
        deleteButton->setEnabled(ui->pb_clear->isEnabled());

        connect(deleteButton, &QPushButton::clicked, this, &eventrecord_table::onDeleteButtonClicked);
        ui->tableWidget->setCellWidget(i, 6, deleteButton);
    }

    // 设置表格列宽自适应填满
    ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    // 操作列固定宽度
    ui->tableWidget->horizontalHeader()->setSectionResizeMode(6, QHeaderView::Fixed);
    ui->tableWidget->setColumnWidth(6, 100);

    ui->tableWidget->resizeRowsToContents();

    qDebug() << "表格更新完成";
}

void eventrecord_table::onDeleteButtonClicked()
{
    QPushButton *button = qobject_cast<QPushButton *>(sender());
    if (!button)
        return;

    int row = button->property("row").toInt();
    int recordId = button->property("recordId").toInt(); // 获取记录ID

    // 弹出确认对话框
    QMessageBox msgBox(this);
    msgBox.setWindowTitle("确认删除");
    msgBox.setText("确定要删除这条记录吗？");
    msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
    msgBox.setDefaultButton(QMessageBox::No);

    int ret = msgBox.exec();
    if (ret != QMessageBox::Yes)
    {
        return; // 用户取消删除
    }

    // 获取数据库连接
    QSqlDatabase db;
    if (QSqlDatabase::contains("warning_db"))
    {
        db = QSqlDatabase::database("warning_db");
    }
    else
    {
        db = QSqlDatabase::database();
    }

    if (!db.isValid())
    {
        emit signalToForward("数据库连接无效");
        return;
    }

    if (!db.isOpen())
    {
        if (!db.open())
        {
            emit signalToForward("数据库打开失败: " + db.lastError().text());
            return;
        }
    }

    // 执行删除操作，使用记录ID作为条件
    QSqlQuery query(db);
    query.prepare("DELETE FROM warnings WHERE id = ?");
    query.addBindValue(recordId);
    qDebug() << "recordId" << recordId;
    if (!query.exec())
    {
        QMessageBox::warning(this, "错误", "删除记录失败: " + query.lastError().text());
        return;
    }

    // 删除成功后重新查询并刷新数据
    QDateTime startTimeEdit = ui->startTimeEdit->dateTime();
    QDateTime endTimeEdit = ui->endTimeEdit->dateTime();
    QString startStr = startTimeEdit.toString("yyyy-MM-dd HH:mm:ss");
    QString endStr = endTimeEdit.toString("yyyy-MM-dd HH:mm:ss");
    queryAndDisplayEvents(startStr, endStr);

    QMessageBox::information(this, "成功", "记录已删除");
}
void eventrecord_table::on_pb_quary_clicked()
{
    // 获取开始时间和结束时间
    QDateTime startTime = ui->startTimeEdit->dateTime();
    QDateTime endTime = ui->endTimeEdit->dateTime();

    // 检查时间范围是否超过一个月
    QDateTime maxEndTime = startTime.addMonths(1);
    if (endTime > maxEndTime)
    {
        // 超过一个月，将结束时间设置为开始时间加一个月
        endTime = maxEndTime;
        ui->endTimeEdit->setDateTime(endTime);
        QMessageBox::information(this, "时间调整", "查询时间范围不允许超出一个月，已自动调整为一个月内！");
    }

    // 执行查询
    QString startStr = startTime.toString("yyyy-MM-dd HH:mm:ss");
    QString endStr = endTime.toString("yyyy-MM-dd HH:mm:ss");
    qDebug() << "开始时间:" << startStr << "结束时间:" << endStr;
    queryAndDisplayEvents(startStr, endStr);
}

void eventrecord_table::on_pb_clear_clicked()
{
    // 弹出确认对话框
    QMessageBox msgBox(this);
    msgBox.setWindowTitle("确认清空");
    msgBox.setText("确定要清空所有历史报警记录吗？此操作不可恢复！");
    msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
    msgBox.setDefaultButton(QMessageBox::No);

    int ret = msgBox.exec();
    if (ret != QMessageBox::Yes)
    {
        return; // 用户取消操作
    }

    // 获取数据库连接
    QSqlDatabase db;
    if (QSqlDatabase::contains("warning_db"))
    {
        db = QSqlDatabase::database("warning_db");
    }
    else
    {
        db = QSqlDatabase::database();
    }

    if (!db.isValid())
    {
        emit signalToForward("数据库连接无效");
        return;
    }

    if (!db.isOpen())
    {
        if (!db.open())
        {
            emit signalToForward("数据库打开失败: " + db.lastError().text());
            return;
        }
    }

    // 执行清空操作
    QSqlQuery query(db);
    query.prepare("DELETE FROM warnings");

    if (!query.exec())
    {
        QMessageBox::warning(this, "错误", "清空记录失败: " + query.lastError().text());
        return;
    }

    // 清空成功后重新查询并刷新数据
    QDateTime startTimeEdit = ui->startTimeEdit->dateTime();
    QDateTime endTimeEdit = ui->endTimeEdit->dateTime();
    QString startStr = startTimeEdit.toString("yyyy-MM-dd HH:mm:ss");
    QString endStr = endTimeEdit.toString("yyyy-MM-dd HH:mm:ss");
    queryAndDisplayEvents(startStr, endStr);

    QMessageBox::information(this, "成功", "所有历史报警记录已清空");

    signalToForward("EventRecord cleared");
}
